package com.java.zhuiyun.api.pc_login.service.impl;

import com.java.zhuiyun.api.front_desk_user.entity.FrontDeskUser;
import com.java.zhuiyun.api.pc_login.entity.Register;
import com.java.zhuiyun.api.pc_login.entity.SysUserDto;
import com.java.zhuiyun.api.pc_login.mapper.PcLoginMapper;
import com.java.zhuiyun.api.pc_login.service.PcLoginService;
import com.java.zhuiyun.api.sys_user.entity.SysUser;
import com.java.zhuiyun.common.response.CommonConstants;
import com.java.zhuiyun.common.response.CommonResult;
import com.java.zhuiyun.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @ClassName PcLoginServiceImpl
 * @Description TODO
 * @Author WX
 * @Date 2023/8/23 15:22
 **/
@Service
public class PcLoginServiceImpl implements PcLoginService {
    @Autowired
    private PcLoginMapper pcLoginMapper;

    @Resource
    RedisUtil redisUtil;

    @Resource
    Sample sample;

    @Resource
    MailUtil mailUtil;

    /*
    * @Author WX
    * @Description 登录查询
    * @Date 2023/8/31 10:27
    * @Return
    * @param null
    */
    @Override
    public SysUserDto login(FrontDeskUser frontDeskUser) {
        SysUserDto sysUserDto = pcLoginMapper.login(frontDeskUser);
        if (frontDeskUser != null){
            return  sysUserDto;
        }else {
           return null;
        }
    }

    /**
    * @Author 杨友朋
    * @Description TODO 邮箱验证码登录
    * @Date 2023/8/30 8:35
    * @Return
    * @param
    */
    @Override
    public CommonResult emailCodeLogin(Register register) {
        // 验证邮箱格式
        if(RegexUtils.isEmailInvalid(register.getEmail())){
            return CommonResult.error(500,"邮箱格式验证失败");
        }

        // 获取验证码
        String code = redisUtil.get(register.getEmail()).toString();

        // 判断验证码
        if(register.getCode().equals(code)){
            // 校验用户是否存在
            FrontDeskUser frontDeskUser = pcLoginMapper.selectByEmail(register.getEmail());
            if (frontDeskUser.getAccountType() != 0) {
                // 获取当前时间
                Date banTime = frontDeskUser.getBanTime();
                // 创建日期格式化器
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                // 将日期对象格式化为字符串
                String formattedTime = dateFormat.format(banTime);
                // 构建错误信息
                String errorMessage = "账号已被封禁，解封时间：" + formattedTime;
                return CommonResult.error(errorMessage);
            }
            if(frontDeskUser!=null){
                return CommonResult.ok(frontDeskUser);
            }
            return CommonResult.error(500,"用户不存在");
        }
        return CommonResult.error(500,"验证码验证失败");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 邮箱密码登录
    * @Date 2023/8/30 8:35
    * @Return
    * @param
    */
    @Override
    public CommonResult emailLogin(Register register) {
        // 验证邮箱格式
        if(RegexUtils.isEmailInvalid(register.getEmail())){
            return CommonResult.error(500,"邮箱格式验证失败");
        }

        FrontDeskUser frontDeskUser = pcLoginMapper.selectByEmail(register.getEmail());
        if (frontDeskUser.getAccountType() != 0) {
            // 获取当前时间
            Date banTime = frontDeskUser.getBanTime();
            // 创建日期格式化器
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 将日期对象格式化为字符串
            String formattedTime = dateFormat.format(banTime);
            // 构建错误信息
            String errorMessage = "账号已被封禁，解封时间：" + formattedTime;
            return CommonResult.error(errorMessage);
        }
        if(frontDeskUser!=null){
            if(Md5Utils.getMd5(register.getPassword()).equals(frontDeskUser.getFrontDeskPassword())){
                return CommonResult.ok(frontDeskUser);
            }
            return CommonResult.error(500,"密码错误");
        }
        return CommonResult.error(500,"用户不存在");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 注册
    * @Date 2023/8/25 10:45
    * @Return
    * @param
    */
    @Override
    public CommonResult register(Register register) {
        // 获取验证码
        String code=redisUtil.get(register.getPhone()).toString();

        // 校验验证码
        if (code.equals(register.getCode())){
            // 查询用户是否存在
            FrontDeskUser frontDeskUser = pcLoginMapper.selectByPhone(register.getPhone());
            if(frontDeskUser!=null){
                // 获取当前时间
                Date banTime = frontDeskUser.getBanTime();
                // 创建日期格式化器
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                // 将日期对象格式化为字符串
                String formattedTime = dateFormat.format(banTime);
                // 构建错误信息
                String errorMessage = "账号已被封禁，解封时间：" + formattedTime;
                return CommonResult.error(errorMessage);
            }
            // 创建对象
            FrontDeskUser f=new FrontDeskUser();
            // 用户名
            f.setFrontDeskName(generateSystemName());
            // 手机号
            f.setFrontDeskPhone(register.getPhone());
            // 密码
            f.setFrontDeskPassword(register.getPassword());
            // 默认头像
            f.setImg(1);
            // 创建时间
            f.setCreateTime(new Date());
            // 修改时间
            f.setUpdateTime(new Date());
            // 添加
            f.setFrontDeskPassword(Md5Utils.getMd5(f.getFrontDeskPassword()));
            pcLoginMapper.insertSelective(f);
            return CommonResult.ok("注册成功");
        }
        return CommonResult.error("验证码有误,验证失败");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 手机号发送验证码
    * @Date 2023/8/28 8:28
    * @Return
    * @param
    */
    @Override
    public CommonResult phoneSendCode(Register register) throws Exception {
        // 验证手机号格式
        if(RegexUtils.isPhoneInvalid(register.getPhone())){
            return CommonResult.error(500,"手机号格式验证失败");
        }

        // 生成验证码
        String code = sample.senCode(register.getPhone());

        // 存入redis
        redisUtil.set(register.getPhone(),code);
        return CommonResult.ok("验证码已发送");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 邮箱发送验证码
    * @Date 2023/8/28 8:28
    * @Return
    * @param
    */
    @Override
    public CommonResult emailSendCode(Register register) {
        // 校验手机号格式
        if(!RegexUtils.isEmailInvalid(register.getEmail())){
                // 标题
                String title= "智学IT课堂";
                // 生成验证码
                Integer i= ThreadLocalRandom.current().nextInt(100000, 1000000);
                String code=i.toString();
                // 内容
                String content= "您的登录验证码为" + code + ",请妥善保管。";
                // 发送验证码
                mailUtil.sendSimpleMail(register.getEmail(),title,content);
                redisUtil.set(register.getEmail(),code);
                return CommonResult.ok("验证码发送成功");
        }
        return CommonResult.error(500,"邮箱格式验证失败");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 手机号验证码登录
    * @Date 2023/8/28 8:28
    * @Return
    * @param
    */
    @Override
    public CommonResult phoneCodeLogin(Register register) {
        // 获取验证码
       String s = redisUtil.get(register.getPhone()).toString();

        // 验证验证码
       if(!s.equals(register.getCode())){
           return CommonResult.error(500,"验证码错误");
       }

        // 查询用户是否存在
        FrontDeskUser frontDeskUser = pcLoginMapper.selectByPhone(register.getPhone());
        if (frontDeskUser.getAccountType() != 0) {
            // 获取当前时间
            Date banTime = frontDeskUser.getBanTime();
            // 创建日期格式化器
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 将日期对象格式化为字符串
            String formattedTime = dateFormat.format(banTime);
            // 构建错误信息
            String errorMessage = "账号已被封禁，解封时间：" + formattedTime;
            return CommonResult.error(errorMessage);
        }
        if (frontDeskUser != null){
            return CommonResult.ok(frontDeskUser);
        }
        return CommonResult.error(500,"账号信息有误");
    }

    /**
    * @Author 杨友朋
    * @Description TODO 手机号密码登录
    * @Date 2023/8/28 8:27
    * @Return
    * @param
    */
    @Override
    public CommonResult phoneLogin(Register register) {
        // 验证手机号格式
        if(!RegexUtils.isPhoneInvalid(register.getPhone())){

            // 查询用户
            FrontDeskUser frontDeskUser = pcLoginMapper.selectByPhone(register.getPhone());
            if (frontDeskUser.getAccountType() != 0) {
                // 获取当前时间
                Date banTime = frontDeskUser.getBanTime();
                // 创建日期格式化器
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                // 将日期对象格式化为字符串
                String formattedTime = dateFormat.format(banTime);
                // 构建错误信息
                String errorMessage = "账号已被封禁，解封时间：" + formattedTime;
                return CommonResult.error(errorMessage);
            }
            // 判断用户是否存在
            if(frontDeskUser!=null){

                if(frontDeskUser.getFrontDeskPassword().equals(Md5Utils.getMd5(register.getPassword()))){

                    return CommonResult.ok(frontDeskUser);
                }

                return CommonResult.error(500,"密码不正确");
            }
            return CommonResult.error(500,"账号不存在");
        }

        return CommonResult.error(500,"手机号验证失败");
    }

    /**
    * @Author 杨友朋
    * @Description 生成默认用户名
    * @Date 2023/8/28 8:27
    * @Return
    * @param
    */
    public static String generateSystemName() {
        // 生成验证码
        String uniqueId = UUID.randomUUID().toString();
        String systemName = "it_class_user_" + uniqueId.replace("-", "").substring(0, 8);
        return systemName;
    }

}
